#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQuery>
#include <QGraphicsDropShadowEffect>
#include <QDebug>
#include <QMessageBox>
#include <QCryptographicHash> // md5加密的库
#include "userInfoUtil.h"
/*
 * Date:        2022/11/15
 * Name:        王宇轩
 * Student ID:  20301142
 * Description: 这个类支持用户登陆、注册和密码找回三个功能，
 *              通过stackedWidget存储这三个功能对应的界面，
 *              点击按钮进行切换。
*/
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setFixedSize(this->geometry().size());
    //设置图片的阴影效果
    QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
    shadow->setOffset(-3, 0);
    shadow->setColor(QColor("#888888"));
    shadow->setBlurRadius(30);
    ui->label_image->setGraphicsEffect(shadow);
    ui->label_rimage->setGraphicsEffect(shadow);

    //槽函数
    connect(this,SIGNAL(sendData(QString)),userWindow,SLOT(receiveData(QString)));

}

MainWindow::~MainWindow()
{
    delete ui;
}
//**********************工具函数***********************
//清空此窗口所有输入框内的内容
void MainWindow::clearText()
{
    ui->username->clear();
    ui->password->clear();
    ui->r_username->clear();
    ui->r_pwd->clear();
    ui->r_confirmPsd->clear();
}

//**********************登陆界面***********************
//登录功能
void MainWindow::on_loginButton_clicked()
{
    //获取用户输入
    QString username=ui->username->text();
    QString password=ui->password->text();

    //异常检测，若用户名或密码为空，则做出提示
    if(username.isEmpty()||password.isEmpty()){
        QMessageBox::information(this, "提示", "请输入用户名和密码!");
        ui->username->setFocus();
        return;
    }

    //判断是否存在该用户
    if(!isUserExist(username)){
        QMessageBox::critical(this, "提示", "当前用户不存在，请检查输入或注册用户");
        return;
    }

    if(!isUserAndPswMatch(username,password)){
        QMessageBox::critical(this, "提示", "用户名和密码不匹配！");
        return;
    }

    //登陆成功，关闭当前窗口，打开系统主界面。
    this->close();
    emit this->sendData(username);
    userWindow->show();
}


//注册功能
void MainWindow::on_registerButton_clicked()
{
    //登陆界面点击注册按钮，切换到注册界面。
    this->clearText();
    ui->stackedWidget->setCurrentWidget(ui->registerPage);
}

//***********************注册界面***************************
//从注册界面返回登陆界面
void MainWindow::on_return_btn_clicked()
{
    this->clearText();
    ui->stackedWidget->setCurrentWidget(ui->loginPage);
}

//注册功能按钮
void MainWindow::on_register_btn_clicked()
{
    //获取用户输入的注册信息
    QString username=ui->r_username->text();
    QString password=ui->r_pwd->text();
    QString confirmPassword=ui->r_confirmPsd->text();

    //异常检测，若用户名或密码为空，则做出提示
    if(username.isEmpty()||password.isEmpty()||confirmPassword.isEmpty()){
        QMessageBox::critical(this, "提示", "用户名或密码为空!");
        ui->r_username->setFocus();
        return;
    }

    if(!checkUsername(username)){
        QMessageBox::critical(this, "提示", "请确保用户名由6-12位字母、数字、下划线组成");
        return;
    }
    if(!checkPsw(password)){
        QMessageBox::critical(this, "提示", "密码长度为6-12位，且必须为数字、大小写字母或符号中至少2种!");
        return;
    }

    if(isUserExist(username)){
        QMessageBox::critical(this, "提示", "当前用户名已被使用，请更换！");
        return;
    }

    if(password!=confirmPassword){
        QMessageBox::critical(this, "提示", "两次输入密码不一致！");
        return;
    }

    // 将密码转换为md5格式
    QString psw =
        QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex();

    QString sql=QString("insert into user(username,password) values('%1','%2')")
                .arg(username,psw);

    QSqlQuery result;
    if(result.exec(sql)){
        ui->stackedWidget->setCurrentWidget(ui->loginPage);
    }else{
        QMessageBox::critical(this, "提示", "注册失败！");
    }
}

